//////////////////////////////////////////////////////////////////////////

#ifndef _CONNECTION_H_
#include "connection.h"
#endif

//////////////////////////////////////////////////////////////////////////

#ifndef _CONNECTIONIMPL_H_
#include "connectionimpl.h"
#endif

#include <iostream>

//////////////////////////////////////////////////////////////////////////


Connection::Connection(bool _server)
: m_Impl(NULL)
{
    m_Impl = _server ?
        ConnectionImpl::GetBoostServerConnectionImpl() :
        ConnectionImpl::GetBoostClientConnectionImpl();


    AddEventToObserve( Observer::NETWORK_ACCEPTED_NEW_CONNECTION );
    AddEventToObserve( Observer::NETWORK_RECEIVE_COMPLETE_TCP );
    AddEventToObserve( Observer::NETWORK_RECEIVE_COMPLETE_UDP );
    AddEventToObserve( Observer::NETWORK_SEND_COMPLETE_TCP );
    AddEventToObserve( Observer::NETWORK_SEND_COMPLETE_UDP );

    m_Impl->AddObserver(this);
}


//////////////////////////////////////////////////////////////////////////


Connection::~Connection()
{
    if (m_Impl)
        delete m_Impl;
}


//////////////////////////////////////////////////////////////////////////


void Connection::SendTCP( const Packet& _data )
{
    m_Impl->SendTCP(_data);
}


//////////////////////////////////////////////////////////////////////////


void Connection::SendUDP( const Packet& _data )
{
    m_Impl->SendUDP(_data);
}


//////////////////////////////////////////////////////////////////////////


const Packet& Connection::GetRecvDataTCP() const
{
    return m_Impl->GetRecvDataTCP();
}


//////////////////////////////////////////////////////////////////////////


const Packet& Connection::GetRecvDataUDP() const
{
    return m_Impl->GetRecvDataUDP();
}


//////////////////////////////////////////////////////////////////////////


void Connection::Connect( const char* _address)
{
    m_Impl->Connect(_address);
}


//////////////////////////////////////////////////////////////////////////


void Connection::Accept()
{
    m_Impl->Accept();
}


//////////////////////////////////////////////////////////////////////////


void Connection::Close()
{
    m_Impl->Close();
}


//////////////////////////////////////////////////////////////////////////


void Connection::OnEvent( Event _event, Observable* _observable )
{
    // Redirect
    NotifyObservers(_event);
}



//////////////////////////////////////////////////////////////////////////
